package com.itheima.sh.test;

import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.User;
import com.itheima.sh.util.SqlSessionUtil;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MybatisTest01 {
    private static UserMapper mapper = null;
    private static SqlSession sqlSession = null;

    @BeforeClass
    public static void beforeClass() throws Exception {
        sqlSession = SqlSessionUtil.getSqlSession();
        //4.获取接口动态代理对象
        mapper = sqlSession.getMapper(UserMapper.class);
    }

    @Test
    public void queryAllUsers() throws Exception {
       /* //1.创建工厂创造类对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //2.获取工厂对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sessionFactory = builder.build(is);*/
//        SqlSessionFactory sessionFactory = builder.build(is,"test");
        //3.获取会话对象
//        SqlSession sqlSession = sessionFactory.openSession();
        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
        //4.获取接口动态代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //5.使用接口的动态代理对象调用接口中的查询所有用户方法
        List<User> list = mapper.findAllUsers();
        //6.输出集合
        System.out.println("list = " + list);
    }

    /*
        根据id查询
         User queryUserById(Integer id);
     */
    @Test
    public void queryUserById(){
        //1.获取会话对象
//        SqlSession sqlSession = SqlSessionUtil.getSqlSession();
//        //2.获取接口动态代理对象
//        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //3.使用接口代理对象调用接口查询方法
        User user = mapper.queryUserById(1);
        System.out.println("user = " + user);
    }
    /*
        插入数据
         void addUser(User user);
         说明：
         mysql是自动提交事务，如果将事务交给mybatis处理，那么mybatis默认是
         手动提交事务，我们如果执行DML语句必须提交事务，这里有两种处理方案：
         1.使用sqlSession会话对象调用commit()方法。手动提交事务
         2.开启自动提交事务
         SqlSession sqlSession = sessionFactory.openSession(true);
     */
    @Test
    public void addUser(){
        //1.使用动态代理对象调用方法
        //创建User对象
        User user = new User();
        user.setUserName("柳岩");
        user.setAge(18);
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("湖南");
        mapper.addUser(user);

        //获取新插入数据的主键id值
        System.out.println(user.getId());
//        sqlSession.commit();
    }
    /*
         //更新数据
        void updateUser(User user);
     */
    @Test
    public void updateUser(){
        //使用代理对象调用更新方法
        //创建User对象
        User user = new User();
        user.setUserName("杨幂");
        user.setAge(19);
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("北京");
        user.setId(6);
        mapper.updateUser(user);
    }
    /*
        //根据id删除
        void deleteUserById(Integer id);
     */
    @Test
    public void deleteUserById(){
        mapper.deleteUserById(6);
    }
    /*
         //需求：根据用户名和性别查询用户
        List<User> queryUserByUsernameAndSex(String username,String sex);
     */
    @Test
    public void queryUserByUsernameAndSex(){
        List<User> list = mapper.queryUserByUsernameAndSex("柳岩", "女");
        System.out.println("list = " + list);
    }
    /*
         //需求：模拟用户登录，登录方法参数是Map集合，泛型都是String类型分别表示用户名和性别。
         List<User> login(Map<String,String> map);
     */
    @Test
    public void login(){
        //创建Map
        HashMap<String, String> hm = new HashMap<>();
        //添加数据
        hm.put("username", "柳岩");
        hm.put("gender", "女");
        List<User> list = mapper.login(hm);
        System.out.println("list = " + list);
    }
    /*
            //需求：查询user表中的总记录数。
        int queryUserCount(@Param("user")String tableName);
     */@Test
    public void queryUserCount(){
        int count = mapper.queryUserCount("user");
        System.out.println("count = " + count);
    }

    @Test
    public void queryUserByUsernameAndSex2(){
        List<User> list = mapper.queryUserByUsernameAndSex2("柳岩", "女");
        System.out.println("list = " + list);
    }
    /*
         Map<String,Object> queryUserByIdMap(@Param("id") Integer id);
         map = {birthday=1980-10-24, address=花果山水帘洞, user_name=孙悟空, sex=男, id=1, age=30}
         说明：
         如果返回值是map并且只有一行数据，那么列名作为键，列值作为value
     */
    @Test
    public void queryUserByIdMap(){
        Map<String, Object> map = mapper.queryUserByIdMap(1);
        System.out.println("map = " + map);
    }
    /*
        需求：查询数据表所有的数据封装到Map<String,User>集合中
        ​	要求： Key值为一条记录的主键，Value值为pojo的对象.
            Map<String,User> queryUserByIdMap2();
     */
    @Test
    public void queryUserByIdMap2(){
        Map<String, Object> map = mapper.queryUserByIdMap2();
        System.out.println("map = " + map);
    }

    /*
        【需求】：查询**男性**用户，**如果输入了用户名，按用户名模糊查询**,如果**没有输入用户名，就查询所有男性用户**。
        List<User> queryUserBySexOrUsername(@Param("username")String username);
     */
    @Test
    public void queryUserBySexOrUsername(){
        List<User> list = mapper.queryUserBySexOrUsername(null);
        System.out.println("list = " + list);
    }
    /*
          编写一个查询方法，设置两个参数，一个是用户名，一个是住址。

        根据用户名或者住址查询所有男性用户:
            如果输入了用户名则按照用户名模糊查找，
            否则就按照住址查找，两个条件只能成立一个，
            如果都不输入就查找用户名为“孙悟空”的用户。
        List<User> queryUserBySexOrUsernameOrAddr(@Param("username")String username,@Param("address")String address);
     */
    @Test
    public void queryUserBySexOrUsernameOrAddr(){
        List<User> list = mapper.queryUserBySexOrUsernameOrAddr("", "");
        System.out.println("list = " + list);
    }

    /*

        如果输入了用户名按照用户名进行查询，
        如果输入住址，按住址进行查询，
        如果两者都输入，两个条件都要成立。
        List<User> queryUserByUsernameAndAddr(@Param("username")String username,@Param("address")String address);
             select * from user where user_name=#{username} and address=#{address}
     */
    @Test
    public void queryUserByUsernameAndAddr(){
        List<User> list = mapper.queryUserByUsernameAndAddr("", "湖南");
        System.out.println("list = " + list);
    }
    /*
        案例：修改用户信息，如果参数user中的某个属性为null，则不修改。
        void updateUser2(User user);
     */
    @Test
    public void updateUser2(){
        User user = new User();
        user.setUserName("冰冰");
        user.setAge(null);
        user.setBirthday(new Date());
        user.setSex("女");
        user.setAddress("");
        user.setId(8);
        mapper.updateUser2(user);
    }
    /*
         需求：按照id值是1，2，3来查询用户数据；
        select * from user where id in(1,2,3)
        List<User> queryUsersByIds(@Param("arrIds")Integer[] arrIds);
     */
    @Test
    public void queryUsersByIds(){
        //定义数组存储id
        Integer[] arrIds = {1,2,3};
        List<User> list = mapper.queryUsersByIds(arrIds);
        System.out.println("list = " + list);
    }
}
